home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / fun / world.5 < prev    next >
Text File  |  1989-02-02  |  58KB  |  2,653 lines

  1. Path: xanth!ames!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i012:  world - text adventure, Part05/07
  5. Message-ID: <11528@swan.ulowell.edu>
  6. Date: 2 Feb 89 05:05:14 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 2642
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: ejkst@unix.cis.pittsburgh.edu (Eric J. Kennedy)
  12. Posting-number: Volume 89, Issue 12
  13. Archive-name: fun/world.5
  14.  
  15. #    This is a shell archive.
  16. #    Remove everything above and including the cut line.
  17. #    Then run the rest of the file through sh.
  18. #----cut here-----cut here-----cut here-----cut here----#
  19. #!/bin/sh
  20. # shar:    Shell Archiver
  21. #    Run the following text with /bin/sh to create:
  22. #    helper.c
  23. #    verbs1.c
  24. # This archive created: Mon Jan 30 18:06:46 1989
  25. cat << \SHAR_EOF > helper.c
  26. #include <stdio.h>
  27. #include "parame.inc"
  28. #include "variab.h"
  29. #include "arrays.h"
  30. #include "qtext.inc"
  31. #define abs(A) ((A < 0) ? -A : A)
  32.  
  33. #ifndef AMIGA
  34. #  define Q1TEXT    "/usr/games/lib/q1text.dat"
  35. #endif
  36.  
  37. /* World C Version 1.00 copyright 1987 J.D.McDonald 
  38.    Use as you like for non-commercial purposes, but please
  39.    leave this note, and document any changes you make as yours */
  40.  
  41. static int      start = 0;
  42. int             q1text_dat;
  43. static int      debugflg = 1;
  44. static char     filenm[] = "world.sav";
  45.  
  46. static short    buffer[512];
  47. static long     filepos, oldpos;
  48.      
  49.  
  50. speak(point)
  51.     int             point;
  52. {
  53.     /* 
  54.      * this is the main routine to output text from the data file the word
  55.      * rtext(point) points to the proper record in the file  
  56.      */
  57.     int             i, bi, t, kk;
  58.     long            z;
  59.  
  60.     if (start == 0) {
  61.     start += 1;
  62.     oldpos = -1;
  63. #ifndef AMIGA                     /* q1text.dat already opened in wbstuff.c */
  64.     q1text_dat = open(Q1TEXT, 0);
  65. #endif
  66.       
  67.     }
  68.     z = (long) ((unsigned long) rtext[point]);
  69.     filepos = z * 2 & ~1023l;
  70.     if (filepos != oldpos) {
  71.     oldpos = filepos;
  72.     lseek(q1text_dat, filepos, 0);
  73.     read(q1text_dat, buffer, 512*sizeof(short));
  74.     }
  75.     bi = z & 511;
  76.     do {
  77.     kk = 0;
  78.     while (1) {
  79.         if (bi == 512) {
  80.         oldpos += 1024;
  81.         lseek(q1text_dat, oldpos, 0);
  82.         read(q1text_dat, buffer, 512*sizeof(short));
  83.         bi = 0;
  84.         }
  85.         t = buffer[bi];
  86.             z++;
  87.             bi++;
  88.  
  89.         if (t < 0) {
  90.         t = -t;
  91.         outst2[kk++] = t & 127;
  92.         outst2[kk++] = t >> 8;
  93.         } else {
  94.         outst2[kk++] = (t % 32) + 96;
  95.         outst2[kk++] = ((t >> 5) % 32) + 96;
  96.         outst2[kk++] = t / 1024 + 96;
  97.         if (outst2[kk - 3] == '{') {
  98.             kmax = kk - 4;
  99.                 break;
  100.         } 
  101.         }
  102.         if (outst2[kk - 2] == '{') {
  103.                 kmax = kk - 3;
  104.         break;
  105.         } else if (outst2[kk - 1] == '{') {
  106.             kmax = kk - 2;
  107.         break;
  108.         }
  109.     }
  110.     for (i = 0; i <= kmax; i++) {
  111.         if (outst2[i] == '`')
  112.         outst2[i] = ' ';
  113.         if (outst2[i] == '|')
  114.         outst2[i] = '.';
  115.     }
  116.     if (wwflag == 0)
  117.         linout(outst2, kmax + 1);
  118.     } while (z < rtext[point + 1]);
  119. }
  120.  
  121. vlocat(i, h)
  122.     int             i, h;
  123. {
  124.     int             k, p, r, nowir, xloc, xturn;
  125.     /*
  126.      * code for "l" or "locate"  but NOT "look" gtext(2) points to short
  127.      * descriptions in the location area of the text file, while gtext(1)
  128.      * points to the long ones  
  129.      */
  130.  
  131.     if (brfflg == 2 || i == 1 || ((locdat[loc] & 16384) == 0
  132.                   && brfflg != 0) || (loc >= 101 && loc <= 116))
  133.     xloc = loc + gtext[1];
  134.     else
  135.     xloc = loc + gtext[2];
  136.     speak(xloc);
  137.     if (loc == 89) {
  138.     if (easttm == 0) {
  139.         speak(372);
  140.         eastsc |= 1;
  141.     } else if (easttm > 0 && easttm <= 50) {
  142.         speak(373);
  143.         eastsc |= 2;
  144.     } else if (easttm == 51)
  145.         speak(374);
  146.     else {
  147.         speak(375);
  148.         eastsc |= 4;
  149.     }
  150.     }
  151.     xturn = turns % 100;
  152.     if (turns < 8)
  153.     xturn = 8;
  154.     if (h == 0)
  155.     return;
  156.     /* this section prints out the objects at "loc"  */
  157.     for (k = 1; k <= OBJMAX; k++) {
  158.     p = obimpr[k];
  159.     if (!((k <= MOVMAX && obloc[k] != loc) ||
  160.           (k > MOVMAX && (obw3[k] != loc && obw4[k] != loc)) ||
  161.           (k == HPUCK && loc == 38 && marflg[1]))) {
  162.         r = (p / 8) % 8;
  163.         if (r >= 1) {
  164.         if ((p & 1) == 1)
  165.             speak(odistb[k] + r);
  166.         }
  167.         if (!(obpprp[k] / 2048 == 0 && k != ZROBOT))
  168.         xcontn(k);
  169.     } continue;
  170.     }
  171.     /* standing on something?  */
  172.     if (spcloc == 1)
  173.     speak(212);
  174.     if (spcloc == 2) {
  175.     if (dirty == 0)
  176.         speak(509);
  177.     else
  178.         speak(510);
  179.     }
  180.     /* is the wire lying on the ground */
  181.     nowir = 1;
  182.     for (i = 0; i < 6; i++) {
  183.     if (wirelc[i] == loc)
  184.         nowir = 0;
  185.     }
  186.     if (nowir == 0)
  187.     speak(215);
  188.  
  189.     if ((loc == 76 || loc == 77 || loc == 79) && obloc[ZCAT] ==
  190.     80)
  191.     speak(280);
  192.     /* flowers following sun  */
  193.     if (loc == 86 && xturn > 6 && xturn < 69 && obimpr[ZSEED] > 4000)
  194.     speak(341);
  195.     /* vine describe   */
  196.     if (loc == 74 && obimpr[ZVINE] == 9) {
  197.     speak(339);
  198.     obimpr[ZVINE] = 8201;
  199.     } else if (loc == 74 && obimpr[ZVINE] == 8201)
  200.     speak(259);
  201. }
  202.  
  203. vinven()
  204. /* "inventory"  */
  205. {
  206.     int             carryn, wearn, i, k;
  207.  
  208.     carryn = 0;
  209.     wearn = 0;
  210.     if (wirelc[5] == 1000)
  211.     carryn = 1;
  212.     for (i = 1; i <= MOVMAX; i++) {
  213.     if (obloc[i] == 1000)
  214.         carryn = 1;
  215.     if (obloc[i] == 3000)
  216.         wearn = 1;
  217.     }
  218.     if (carryn == 1) {
  219.     speak(62);
  220.         xindnt += 2;
  221.     if (wirelc[5] == 1000)
  222.         speak(256);
  223.     for (k = 1; k <= MOVMAX; k++) {
  224.         if (obloc[k] != 1000)
  225.         continue;
  226.         speak(odistb[k]);
  227.         if (obpprp[k] / 2048 != 0)
  228.         xcontn(k);
  229.     }
  230.         xindnt -= 2;
  231.     }
  232.     if (wearn == 1) {
  233.     speak(63);
  234.         xindnt += 2;
  235.     for (k = 1; k <= MOVMAX; k++) {
  236.         if (obloc[k] != 3000)
  237.         continue;
  238.         speak(odistb[k]);
  239.         if (obpprp[k] / 2048 != 0)
  240.         xcontn(k);
  241.     }
  242.         xindnt -= 2;
  243.     }
  244.     if (carryn == 0 && wearn == 0)
  245.     speak(64);
  246.     nonext = 1;
  247. }
  248.  
  249. xcontn(k)                             /* RECURSIVE FUNCTION */
  250.     int             k;
  251. {
  252.     int             p, empty, k1;
  253.     /*
  254.      * list contents of a container 
  255.      * calls itself recursively to list things inside other containers
  256.      */
  257.  
  258.  
  259.            /* RECURSIVE FUNCTION */
  260.     if (k == LFUNNE || k == MFUNNE || k == RFUNNE)
  261.     return;
  262.     p = obimpr[k];
  263.     if ((p & 2) == 0 || (obpprp[k] & 128) == 0) {
  264.     empty = 1;
  265.     for (k1 = 1; k1 <= MOVMAX; k1++)
  266.         if (obloc[k1] == k + 2000)
  267.         empty = 0;
  268.     if (empty) {
  269.         xindnt += 2;
  270.         speak(odistb[k] + ((p / 512) % 8));
  271.         xindnt -= 2;
  272.     } else {
  273.         xindnt += 2;
  274.         speak(odistb[k] + ((p / 512) % 8) + 1);
  275.         xindnt += 2;
  276.         for (k1 = 1; k1 <= MOVMAX; k1++) {
  277.         if (obloc[k1] == k + 2000) {
  278.             speak(odistb[k1]);
  279.                  if (obpprp[k1] / 2048 != 0)
  280.                 xcontn(k1);
  281.                 }
  282.         }
  283.         xindnt -= 4;
  284.     }
  285.     } else if ((p & 2) != 0 && (obpprp[k] & 128) != 0 && prepdo == IN)
  286.     speak(386);
  287. }
  288.  
  289. dbg()
  290. {
  291.     char tmpstrq[80];
  292.     
  293.     if(debugflg == 0) return;
  294.     debugflg = 2;
  295.     printf(" loc is %5d \n", loc);
  296.     printf(" enter new loc ");
  297.     gets(tmpstrq);
  298.     sscanf(tmpstrq,"%d", &loc);
  299. }
  300.  
  301. scorng()
  302. {
  303.     int             result, i, q, v, l, n, plce, xplc;
  304.     result = 0;
  305.     if (loc >= 153)
  306.     return (0);
  307.     result = (diesc - 3) * 2;
  308.     if (result < 0)
  309.     result = 0;
  310.     if (cactsc == 1 || cactsc == 2)
  311.     result += 2;
  312.     if (cactsc == 3)
  313.     result += 4;
  314.     if ((eastsc & 1) != 0)
  315.     result += 2;
  316.     if ((eastsc & 2) != 0)
  317.     result += 2;
  318.     if ((eastsc & 4) != 0)
  319.     result += 2;
  320.     if(debugflg == 2) 
  321.         printf(" east+cact %5d out of 10\n",result);
  322.     for (i = 1; i <= MOVMAX; i++) {
  323.     q = obw4[i];
  324.     v = q / 4096;
  325.     l = q - v * 4096;
  326.     if (v == 0)
  327.         continue;
  328.         n = 0;
  329.     itsher(i, &plce);
  330.     if (i == GDISC) {
  331.         if (plce != 0 && rvtim == 2)
  332.         n = v;
  333.     } else if (l >= 4000 && l - 4000 != obloc[i])
  334.         n = v;
  335.     else if (l == 3000 && obloc[i] == 3000)
  336.         n = v;
  337.     else if (l == 1000 && (plce == 1 || plce == 3))
  338.         n = v;
  339.     else if (l == 3000 && (plce == 1 || plce == 3))
  340.         n = v / 2;
  341.     else if (l < 1000 && l == obloc[i])
  342.         n = v;
  343.     else if (l > 2000 && l < 3000 && obloc[i] == l) {
  344.         itsher((l - 2000), &xplc);
  345.         if (xplc > 0 && xplc <= 3)
  346.         n = v;
  347.     }
  348.         result += n;
  349.         if(debugflg == 2)printf("obj %5d %5d points out of %5d\n",i,n,v);
  350.     }
  351.     if (deadf)
  352.     result -= 5;
  353.     if (result < 0)
  354.     result = 0;
  355.     result *= 5;
  356.     return (result);
  357. }
  358.  
  359. getrob(don, doa)
  360.     int             don, doa;
  361. {
  362.     int             result, i;
  363.     /*
  364.      * search table for object return object number if found and unambiguous
  365.      * return 0 if not found return -1 if ambiguous  
  366.      */
  367.  
  368.     for (i = 1; i <= OBJMAX; i++) {
  369.     if (don != obnoun[i])
  370.         continue;
  371.     if ((doa == abs(obadjv[i])) || (doa == 0 && obadjv[i] < 0))
  372.         return (i);
  373.     else if (doa == 0 && obadjv[i] > 0)
  374.         result = -1;
  375.     else
  376.         result = 0;
  377.     }
  378.     return (result);
  379. }
  380.  
  381.     static  char    sstring[] =
  382.     "Your score is     out of a total of     in      turns.";
  383.     static  int     breakp[] = {0, 35, 70, 90, 130, 170, 210, 260, 330,
  384.                 380, 450, 900};
  385. scorpt(scor, mxsc)
  386.     int             scor, mxsc;
  387. {
  388.     char            cnum[4];
  389.     int             i;
  390.  
  391.     numcvt(scor, cnum);
  392.     sstring[14] = cnum[1];
  393.     sstring[15] = cnum[2];
  394.     sstring[16] = cnum[3];
  395.     numcvt(mxsc, cnum);
  396.     sstring[36] = cnum[1];
  397.     sstring[37] = cnum[2];
  398.     sstring[38] = cnum[3];
  399.     numcvt(turns, cnum);
  400.     sstring[43] = cnum[0];
  401.     sstring[44] = cnum[1];
  402.     sstring[45] = cnum[2];
  403.     sstring[46] = cnum[3];
  404.     linout(sstring, 54);
  405.     for (i = 0; i < 10; i++) {
  406.     if (scor >= breakp[i] && scor < breakp[i + 1])
  407.         break;
  408.     }
  409.     speak(481 + i);
  410.  
  411. }
  412.  
  413. numcvt(num, cnum)
  414.     int             num;
  415.     char           *cnum;
  416. {
  417.     int             lx, m;
  418.  
  419.     m = num / 1000;
  420.     lx = (m) ? '0' + m : ' ';
  421.     *cnum++ = lx;
  422.     m = (num / 100) % 10;
  423.     lx = (m == 0 && lx == ' ') ? ' ' : '0' + m;
  424.     *cnum++ = lx;
  425.     m = (num / 10) % 10;
  426.     lx = (m == 0 && lx == ' ') ? ' ' : '0' + m;
  427.     *cnum++ = lx;
  428.     m = num % 10;
  429.     *cnum = '0' + m;
  430. }
  431.  
  432. robdsc()
  433. {
  434.     int             rempty, lempty, k;
  435.  
  436.     if (obloc[ZROBOT] >= 90 && obloc[ZROBOT] <= 95)
  437.     speak(gtext[1] + obloc[ZROBOT]);
  438.     else
  439.     speak(226 + obloc[ZROBOT]);
  440.     rempty = 1;
  441.     lempty = 1;
  442.     for (k = 1; k <= MOVMAX; k++) {
  443.     if (obloc[k] == 2000 + ZROBOT)
  444.         rempty = 0;
  445.     if (obloc[k] == obloc[ZROBOT] && k != ZROBOT)
  446.         lempty = 0;
  447.     }
  448.     if (rempty == 0) {
  449.     speak(odistb[ZROBOT] + 5);
  450.     for (k = 1; k <= MOVMAX; k++) {
  451.         xindnt += 2;
  452.         if (obloc[k] == 2000 + ZROBOT)
  453.         speak(odistb[k]);
  454.         xindnt -= 2;
  455.     }
  456.     }
  457.     if (lempty == 0) {
  458.     speak(350);
  459.     for (k = 1; k <= MOVMAX; k++) {
  460.         xindnt += 2;
  461.         if (k != ZROBOT && obloc[k] == obloc[ZROBOT])
  462.         speak(odistb[k]);
  463.         xindnt -= 2;
  464.     }
  465.     }
  466.     if (obloc[ZROBOT] == 90 && (obloc[ZORCHI] == 2000 + ZROBOT
  467.                 || obloc[ZFLYTR] == 2000 + ZROBOT))
  468.     speak(353);
  469. }
  470.  
  471.  
  472. endsl()
  473. {
  474. #ifdef AMIGA
  475.     ttclose();       /* dummy routine to maybe clear screen? */
  476. #endif
  477. }
  478.  
  479.  
  480. vdead()
  481. {
  482.     int             i;
  483.     /*
  484.      * "you're dead,fred" it is incumbent on the calling routine to get to
  485.      * where the body is supposed to lie, and to set oldloc and oldlc2 to
  486.      * ,usually, 0 this routine sets deadf to .true. and drops all his
  487.      * possessions where he is now 
  488.      */
  489.  
  490.     eattim = 0;
  491.     rdietm = 0;
  492.     deadf = 1;
  493.     for (i = 1; i <= MOVMAX; i++)
  494.     if (obloc[i] == 1000 || obloc[i] == 3000)
  495.         obloc[i] = loc;
  496.     if (loc < 153)
  497.     speak(55);
  498.     else
  499.     speak(552);
  500.     nonext = 1;
  501.     eolflg = 1;
  502.     spcloc = 0;
  503.     for (i = 0; i < 6; i++)
  504.     if (wirelc[i] == 1000)
  505.         wirelc[i] = loc;
  506.     if (wirelc[0] != obloc[ZWIRE])
  507.     return;
  508.     for (i = 0; i < 6; i++)
  509.     wirelc[i] = 0;
  510.     diesc += 1;
  511. }
  512.  
  513. itsher(objt, plce)
  514.     int             objt;
  515.     int            *plce;
  516. {
  517.     int             n1;
  518.     /*
  519.      * this subroutine tells if an object is either: being carried     plce=1
  520.      * being worn        plce=2 inside something being carried,and not hidden
  521.      * from view (3) at "loc" and not hidden  (4) inside something at loc (5) 
  522.      */
  523.  
  524.     *plce = 0;
  525.     if (objt <= MOVMAX) {
  526.     if (obloc[objt] == 1000)
  527.         *plce = 1;
  528.     else if (obloc[objt] == 3000)
  529.         *plce = 2;
  530.     else if (obloc[objt] == loc && (obimpr[objt] & 1) == 1)
  531.         *plce = 4;
  532.     else if (obloc[objt] > 2000 && obloc[objt] < 3000) {
  533.         n1 = obloc[objt] - 2000;
  534.         if (n1 <= MOVMAX) {
  535.         if ((obloc[n1] == 1000 || obloc[n1] == 3000)
  536.             && (obimpr[n1] & 2) == 0)
  537.             *plce = 3;
  538.         else if (obloc[n1] == loc && ((obimpr[n1] & 1) == 1)
  539.              && ((obimpr[n1] & 2) == 0))
  540.             *plce = 5;
  541.         else;
  542.         } else if ((obw3[n1] == loc || obw4[n1] == loc) &&
  543.                ((obimpr[n1] & 1) == 1) && ((obimpr[n1] & 2) == 0))
  544.         *plce = 5;
  545.         else;
  546.     } else;
  547.     } else if ((obw3[objt] == loc || obw4[objt] == loc) &&
  548.            ((obimpr[objt] & 1) == 1))
  549.     *plce = 4;
  550. }
  551.  
  552. burden(ncarrd, nweigh, kcarrd, kweigh)
  553.     int            *ncarrd, *nweigh, *kcarrd, *kweigh;
  554. {
  555.     int             i;
  556.     /*
  557.      * calculate weight and number of objects on adventurer and in knapsack  
  558.      */
  559.  
  560.  
  561.     *ncarrd = 0;
  562.     *nweigh = 0;
  563.     for (i = 1; i <= MOVMAX; i++) {
  564.     if (obloc[i] != 1000)
  565.         continue;
  566.     *ncarrd += 1;
  567.     *nweigh += obw3[i] / 256;
  568.     }
  569.     *kcarrd = 0;
  570.     *kweigh = 0;
  571.     for (i = 1; i <= MOVMAX; i++) {
  572.     if (i == ZKNAPS || obloc[i] != (2000 + ZKNAPS))
  573.         continue;
  574.     *kcarrd += 1;
  575.     *kweigh += obw3[i] / 256;
  576.     }
  577. }
  578.  
  579. getobj(don, doa)
  580.     int             don, doa;
  581. {
  582.     /*
  583.      * search table for object return object number if found and unambiguous
  584.      * return 0 if not found return -1 if ambiguous  
  585.      */
  586.  
  587.     int             result, i, g1, g2, ggg, ddd, sum;
  588.     int             aplce, bplce, cplce, dplce, fplce, gplce, mplce, nplce, oplce, pplce;
  589.     int             splce, tplce;
  590.     result = 0;
  591.     for (i = 1; i <= OBJMAX; i++) {
  592.  
  593.     if (don != obnoun[i])
  594.         continue;
  595.     if ((doa == abs(obadjv[i]) && doa != BEAUTI && doa !=
  596.          VENDIN) || (doa == 0 && obadjv[i] < 0)) {
  597.         result = i;
  598.         return (result);
  599.     } else if ((doa == 0 && obadjv[i] > 0) || (doa == VENDIN &&
  600.              don == MACHIN) || (doa == BEAUTI && don == BIRD)) {
  601.         if (don == FISH) {
  602.         if (obloc[CFISH] != 0)
  603.             result = CFISH;
  604.         else
  605.             result = DFISH;
  606.         } else if (don == PANTS) {
  607.         itsher(RPANT, &g1);
  608.         itsher(LPANT, &g2);
  609.         if (g1 != 0 && g2 == 0)
  610.             result = RPANT;
  611.         else if (g1 == 0 && g2 != 0)
  612.             result = LPANT;
  613.         else if ((wrdnum[0] == TAKE && prepdo == OFF) ||
  614.              wrdnum[0] == REMOVE) {
  615.             if (g1 == 2)
  616.             result = RPANT;
  617.             else
  618.             result = LPANT;
  619.         } else if (wrdnum[0] == DROP)
  620.             if (((g1 == 1) || (g1 == 3)) && g2 != 1 && g2 != 3)
  621.             result = RPANT;
  622.         if (((g2 == 1) || (g2 == 3)) && g1 != 1 && g1 != 3)
  623.             result = LPANT;
  624.         else
  625.             result = -1;
  626.         } else if (don == SHIRT) {
  627.         itsher(RSHIRT, &g1);
  628.         itsher(GSHIRT, &g2);
  629.         if (g1 != 0 && g2 == 0)
  630.             result = RSHIRT;
  631.         else if (g1 == 0 && g2 != 0)
  632.             result = GSHIRT;
  633.         else if ((wrdnum[0] == TAKE && prepdo == OFF) ||
  634.              wrdnum[0] == REMOVE) {
  635.             if (g1 == 2)
  636.             result = RSHIRT;
  637.             else
  638.             result = GSHIRT;
  639.         } else if (wrdnum[0] == DROP) {
  640.             if (((g1 == 1) || (g1 == 3)) && g2 != 1 && g2 != 3)
  641.             result = RSHIRT;
  642.             if (((g2 == 1) || (g2 == 3)) && g1 != 1 && g1 != 3)
  643.             result = GSHIRT;
  644.         } else
  645.             result = -1;
  646.         } else if (don == DOOR) {
  647.         if (loc == 41 || loc == 135)
  648.             result = MDOOR;
  649.         else if (loc == 85 || loc == 136)
  650.             result = GDOOR;
  651.         else if (loc == 47 || loc == 51)
  652.             result = RDOOR;
  653.         else if (loc == 165 || loc == 166)
  654.             result = ODOOR;
  655.         else if (loc == 173)
  656.             result = PDOOR;
  657.         else if (loc == 175)
  658.             result = BDOOR;
  659.         else
  660.             result = -1;
  661.         } else if (don == CARTRI) {
  662.         itsher(ZCART, &tplce);
  663.         itsher(CCART, &cplce);
  664.         if (tplce > 0 && cplce <= 0)
  665.             result = ZCART;
  666.         else if (tplce <= 0 && cplce > 0)
  667.             result = CCART;
  668.         else
  669.             result = -1;
  670.         } else if (don == PHOTOG) {
  671.         itsher(PPHOTO, &pplce);
  672.         itsher(MPHOTO, &mplce);
  673.         itsher(OPHOTO, &oplce);
  674.         itsher(APHOTO, &aplce);
  675.         itsher(FPHOTO, &fplce);
  676.         pplce = (pplce < 1) ? pplce : 1;
  677.         mplce = (mplce < 1) ? mplce : 1;
  678.         oplce = (oplce < 1) ? oplce : 1;
  679.         aplce = (aplce < 1) ? aplce : 1;
  680.         fplce = (fplce < 1) ? fplce : 1;
  681.         sum = pplce + mplce + oplce + aplce + fplce;
  682.         {
  683.             if (sum == 0)
  684.             result = 0;
  685.             else if (sum > 1)
  686.             result = -1;
  687.             else {
  688.             if (pplce != 0)
  689.                 result = PPHOTO;
  690.             if (mplce != 0)
  691.                 result = MPHOTO;
  692.             if (oplce != 0)
  693.                 result = OPHOTO;
  694.             if (aplce != 0)
  695.                 result = APHOTO;
  696.             if (fplce != 0)
  697.                 result = FPHOTO;
  698.             }
  699.         }
  700.         } else if (don == BIRD) {
  701.         if (loc == 65 || loc == 66)
  702.             result = RBIRD;
  703.         else if (loc == 78 || loc == 79)
  704.             result = XBIRD;
  705.         else if (loc == 77 || loc == 80)
  706.             result = YBIRD;
  707.         else if (loc == 75 || loc == 76)
  708.             result = ZBIRD;
  709.         else
  710.             result = 0;
  711.         } else if (don == BUTTON) {
  712.         if (loc == 146 || loc == 134)
  713.             result = -1;
  714.         else if (loc == 143)
  715.             result = RDBUTT;
  716.         else if (loc == 169)
  717.             result = GBUTTO;
  718.         else
  719.             result = 0;
  720.         } else if (don == CABLE || don == DISC) {
  721.         if (don == CABLE) {
  722.             ddd = DCABLE;
  723.             ggg = GCABLE;
  724.         } else {
  725.             ddd = BDISC;
  726.             ggg = GDISC;
  727.         }
  728.         itsher(ddd, &dplce);
  729.         itsher(ggg, &gplce);
  730.         if (dplce == 0 && gplce == 0)
  731.             result = 0;
  732.         else {
  733.             if (wrdnum[0] == DROP) {
  734.             if ((dplce == 1 || dplce == 3) && (gplce != 1 
  735.                                                                  && gplce != 3))
  736.                 result = ddd;
  737.             else if ((gplce == 1 || gplce == 3) && 
  738.                                                      (dplce != 1 && dplce != 3))
  739.                 result = ggg;
  740.             else
  741.                 result = -1;
  742.             } else if (wrdnum[0] == TAKE) {
  743.             if ((dplce == 4 || dplce == 5) && (gplce != 4 
  744.                                                                  && gplce != 5))
  745.                 result = ddd;
  746.             else if ((gplce == 4 || gplce == 5) &&
  747.                                                      (dplce != 4 && dplce != 5))
  748.                 result = ggg;
  749.             else
  750.                 result = -1;
  751.             } else {
  752.             if (gplce == 0 && dplce != 0)
  753.                 result = ddd;
  754.             else if (dplce == 0 && gplce != 0)
  755.                 result = ggg;
  756.             else
  757.                 result = -1;
  758.             }
  759.         }
  760.         } else if (don == MACHIN) {
  761.         if (loc == 153)
  762.             result = PMACH;
  763.         else if (loc == 156)
  764.             result = TMACH;
  765.         else if (loc == 158)
  766.             result = NMACH;
  767.         else if (loc == 160)
  768.             result = SMACH;
  769.         else if (loc == 162)
  770.             result = MMACH;
  771.         } else if (don == SLOT) {
  772.         if (loc == 146)
  773.             result = RSLOT;
  774.         else if (loc == 156)
  775.             result = TSLOT;
  776.         else if (loc == 158)
  777.             result = NSLOT;
  778.         else if (loc == 160)
  779.             result = SSLOT;
  780.         else if (loc == 162)
  781.             result = MSLOT;
  782.         } else if (don == COIN) {
  783.         if (loc < 153)
  784.             result = SCOIN;
  785.         else {
  786.             itsher(SCOIN, &splce);
  787.             itsher(BCOIN, &bplce);
  788.             itsher(CCOIN, &cplce);
  789.             itsher(NCOIN, &nplce);
  790.             itsher(PCOIN, &pplce);
  791.             pplce = (pplce < 1) ? pplce : 1;
  792.             nplce = (nplce < 1) ? nplce : 1;
  793.             cplce = (cplce < 1) ? cplce : 1;
  794.             bplce = (bplce < 1) ? bplce : 1;
  795.             splce = (splce < 1) ? splce : 1;
  796.             sum = pplce + nplce + cplce + bplce + splce;
  797.             if (sum == 0)
  798.             result = 0;
  799.             else if (sum > 1)
  800.             result = -1;
  801.             else {
  802.             if (splce != 0)
  803.                 result = SCOIN;
  804.             if (bplce != 0)
  805.                 result = BCOIN;
  806.             if (cplce != 0)
  807.                 result = CCOIN;
  808.             if (nplce != 0)
  809.                 result = NCOIN;
  810.             if (pplce != 0)
  811.                 result = PCOIN;
  812.             }
  813.         }
  814.         } else
  815.         result = -1;
  816.         return (result);
  817.     }
  818.     }
  819.     return (result);
  820. }
  821.     static  char    strng1[] = "    I can't do that to item    on your list.";
  822.     static  char    strng2[] = "    Item number    on your list is ambiguous";
  823.  
  824. cnvobj()
  825. {
  826.     char            cnum[4];
  827.     int             result, many, i, k, n, p, z;
  828.  
  829.     /*
  830.      * this routine searches the list of objects and compares with the list
  831.      * of d.o.'s if an object exists and is unambiguous it's entry in dobjs
  832.      * is replaced by its object number otherwise its entry in dobjs is set
  833.      * to zero the entries in dobsj are then squeezed up if the result was
  834.      * totally unambiguous cnvobj is .true. 
  835.      */
  836.  
  837.     result = 1;
  838.     n = 0;
  839.     if (allflg)
  840.     n = 1;
  841.     many = 0;
  842.     if ((butflg && dobjs[2] != 0) || ((!butflg) &&
  843.                       dobjs[1] != 0))
  844.     many = 1;
  845.     k = 0;
  846.     z = -1;
  847.     for (i = n; i < 12; i++) {
  848.     k += 1;
  849.     if (dobjs[i] == 0)
  850.         break;
  851.     p = getobj(dobjs[i], doadjs[i]);
  852.     if (p > 0) {
  853.         z += 1;
  854.         dobjs[z] = p;
  855.     } else if (p == 0) {
  856.         if (many == 1) {
  857.         numcvt(k, cnum);
  858.         strng1[28] = cnum[2];
  859.         strng1[29] = cnum[3];
  860.         linout(strng1, 44);
  861.         } else
  862.         speak(422);
  863.     } else {
  864.         result = 0;
  865.         if (many == 1) {
  866.         numcvt(k, cnum);
  867.         strng2[16] = cnum[2];
  868.         strng2[17] = cnum[3];
  869.         linout(strng2, 44);
  870.         } else
  871.         speak(70);
  872.         speak(250);
  873.     }
  874.     }
  875.     while (++z < 30)
  876.     dobjs[z] = 0;
  877.     return (result);
  878. }
  879.  
  880. getall()
  881. {
  882.  
  883.     int             temp[30], i, k, d, m;
  884.     /*
  885.      * routine to get "all" or "all but" objects it only works on moveable
  886.      * objects because the only verbs which call it work only on those
  887.      * objects (drop,take, put) 
  888.      */
  889.  
  890.     for (i = 0; i < 30; i++) {
  891.     temp[i] = dobjs[i];
  892.     dobjs[i] = 0;
  893.     }
  894.     k = 0;
  895.     for (i = 1; i <= MOVMAX; i++) {
  896.     itsher(i, &d);
  897.     if (d == 0)
  898.         continue;
  899.     for (m = 0; m < 30; m++)
  900.         if (temp[m] == i)
  901.         goto endloop;
  902.     if (k == 29) {
  903.         speak(106);
  904.         return;
  905.     }
  906.     dobjs[k++] = i;
  907. endloop:
  908.     ;
  909.     }
  910. }
  911.  
  912.  
  913. rdinit()
  914. {
  915.     long            t;
  916.     long            tloc;
  917.     long            time();
  918.     int             ti;
  919.     t = time(&tloc);
  920.     ti =( (int) t) & 32767;
  921.     srand(ti);
  922. }
  923.  
  924. qrand()
  925. {
  926.     return ((rand() & 16383) / 4);
  927. }
  928.  
  929.  
  930. pct(q)
  931.     int             q;
  932. {
  933.     int             j;
  934.  
  935.     j = rand();
  936.     return ((q * 327) > (j & 32767));
  937. }
  938.  
  939. yesx(spk)
  940.     int             spk;
  941. {
  942.     char            ans[90];
  943.     /* ask question, and wait for reply from him */
  944.  
  945.  
  946.     speak(spk);
  947.     more = 0;
  948.     while (1) {
  949.     linout("?", 2001);
  950.     gets(ans);
  951.     more = 1;
  952.     if (strcmp(ans, "Y") == 0 || strcmp(ans, "YES") == 0
  953.         || strcmp(ans, "y") == 0 || strcmp(ans, "yes") == 0)
  954.         return (1);
  955.     else if (strcmp(ans, "N") == 0 || strcmp(ans, "NO") == 0
  956.          || strcmp(ans, "n") == 0 || strcmp(ans, "no") == 0)
  957.         return (0);
  958.     else
  959.         speak(102);
  960.     }
  961. }
  962.  
  963. getln()
  964. {
  965.     /* write a prompt, then read a line from the terminal */
  966.  
  967.     int             i, lastpos;
  968.     linout("> ", 7001);
  969.  
  970.     gets(inbuf);
  971.     eolflg = 0;
  972.     lastpos = strlen(inbuf);
  973.     lastpos = (lastpos > 78) ? 78 : lastpos;
  974.     for (i = lastpos; i < 83; i++)
  975.     inbuf[i] = '.';
  976.     more = 1;
  977.     inbuf[127] = (char)lastpos;
  978. }
  979.  
  980.  
  981. carerr(x, z)
  982.     int             x, z;
  983. {
  984.     /*
  985.      * this nifty routine put a caret on the terminal at the indicated
  986.      * position of a line and then outputs a message  
  987.      */
  988.     /* if not the first sentence on a line, rewrite line.  */
  989.  
  990.     if (clause != 1) {
  991.     linout(" ", 1001);
  992.     linout(inbuf, inbuf[127]);
  993.     }
  994.     if (x > 0) {
  995.     xindnt = x;
  996.     linout("^", 1);
  997.     xindnt = 0;
  998.     } else {
  999.     if (clause != 1) {
  1000.         xindnt = lptr - 1;
  1001.         linout("*", 1);
  1002.         xindnt = 0;
  1003.         speak(423);
  1004.     }
  1005.     }
  1006.     speak(z);
  1007. }
  1008.  
  1009. linout(ustring, num)
  1010.     char           *ustring;
  1011.     int             num;
  1012.  
  1013. {
  1014.     int             num1, i;
  1015.     char            buff[80];
  1016.     char           *cptr;
  1017.  
  1018.     cptr = buff;
  1019.     num1 = num % 1000;
  1020.     for (i = 0; i < xindnt; i++)
  1021.     *cptr++ = ' ';
  1022.  
  1023.     for (i = 0; i < num1; i++)
  1024.     *cptr++ = *ustring++;
  1025.  
  1026.     *cptr++ = '\0';
  1027.     if (num < 1000) {
  1028.         if(more == 19 && nomor == 0) {
  1029.             i = strlen(buff);
  1030.             for( ; i < 73; i++)
  1031.                buff[i] = ' '; 
  1032.             strcpy(&buff[73],"MORE");
  1033.             printf("%1s", buff);
  1034.             gets(buff);
  1035.             more = 0;
  1036.         }
  1037.         else {
  1038.             printf("%1s\n", buff);
  1039.             more += 1;
  1040.         }
  1041.     }
  1042.     else
  1043.     printf("%1s", buff);
  1044. }
  1045.  
  1046.  
  1047. vsuspe(inout)
  1048.     int             inout;
  1049. {
  1050.     short            sbuffer[256];
  1051.     int             result, filedes, i, iret;
  1052.     short           *sbptr, *iptr;
  1053.     result = 0;
  1054.  
  1055.     if (inout != 1) {
  1056.     /* "suspend" or "save"  */
  1057.  
  1058.     filedes = creat(filenm, 0600);
  1059.     if (filedes == -1) {
  1060.         linout("I failed to create your save file.", 34);
  1061.         return (result);
  1062.     }
  1063.     sbptr = sbuffer;
  1064.     *sbptr++ = horflg;
  1065.     for (i = 0; i < 6; i++)
  1066.         *sbptr++ = wirelc[i];
  1067.     *sbptr++ = turns;
  1068.     *sbptr++ = loc;
  1069.     *sbptr++ = oldloc;
  1070.     *sbptr++ = oldlc2;
  1071.     *sbptr++ = brfflg;
  1072.     *sbptr++ = deadf;
  1073.     *sbptr++ = dirty;
  1074.     *sbptr++ = nonext;
  1075.     *sbptr++ = spcloc;
  1076.     *sbptr++ = fshlif;
  1077.     *sbptr++ = noshoe;
  1078.     *sbptr++ = daytim;
  1079.     *sbptr++ = martim;
  1080.     for (i = 0; i < 9; i++)
  1081.         *sbptr++ = marflg[i];
  1082.     *sbptr++ = oextim;
  1083.     *sbptr++ = rdietm;
  1084.     *sbptr++ = rvtim;
  1085.     *sbptr++ = gvtim;
  1086.     *sbptr++ = eattim;
  1087.     *sbptr++ = easttm;
  1088.     *sbptr++ = filmtm;
  1089.     *sbptr++ = screef;
  1090.     *sbptr++ = eastsc;
  1091.     *sbptr++ = cactsc;
  1092.     *sbptr++ = diesc;
  1093.     *sbptr++ = filmst;
  1094.     *sbptr++ = machst;
  1095.     *sbptr++ = dial1;
  1096.     *sbptr++ = dial2;
  1097.     *sbptr++ = dial1x;
  1098.     *sbptr++ = dial2x;
  1099.     *sbptr++ = bonus;
  1100.     *sbptr++ = jackpo;
  1101.     *sbptr++ = lpill;
  1102.     *sbptr++ = pbstat;
  1103.     *sbptr++ = decset;
  1104.     *sbptr++ = raset;
  1105.     *sbptr++ = dcombi;
  1106.     *sbptr++ = chaset;
  1107.     *sbptr++ = guardl;
  1108.         *sbptr++ = fimage;
  1109.     write(filedes, sbuffer, 64*sizeof(short));
  1110.     sbptr = sbuffer;
  1111.     iptr = locdat;
  1112.     for (i = 0; i <= LOCNUM; i++)
  1113.         *sbptr++ = *iptr++;
  1114.     write(filedes, sbuffer, 256*sizeof(short));
  1115.     sbptr = sbuffer;
  1116.     iptr = obimpr;
  1117.     for (i = 0; i <= OBJMAX; i++)
  1118.         *sbptr++ = *iptr++;
  1119.     write(filedes, sbuffer, 256*sizeof(short));
  1120.     sbptr = sbuffer;
  1121.     iptr = obloc;
  1122.     for (i = 0; i <= OBJMAX; i++)
  1123.         *sbptr++ = *iptr++;
  1124.     write(filedes, sbuffer, 256*sizeof(short));
  1125.     close(filedes);
  1126.     return (result);
  1127.     } else {
  1128.     /* "restore"    */
  1129.  
  1130.     filedes = open(filenm, 0);
  1131.     if (filedes == -1)
  1132.         goto lab1;
  1133.     iret = read(filedes, sbuffer, 64*sizeof(short));
  1134.     if (iret != 64*sizeof(short))
  1135.         goto lab1;
  1136.     sbptr = sbuffer;
  1137.     horflg = *sbptr++;
  1138.     for (i = 0; i < 6; i++)
  1139.         wirelc[i] = *sbptr++;
  1140.     turns = *sbptr++;
  1141.     loc = *sbptr++;
  1142.     oldloc = *sbptr++;
  1143.     oldlc2 = *sbptr++;
  1144.     brfflg = *sbptr++;
  1145.     deadf = *sbptr++;
  1146.     dirty = *sbptr++;
  1147.     nonext = *sbptr++;
  1148.     spcloc = *sbptr++;
  1149.     fshlif = *sbptr++;
  1150.     noshoe = *sbptr++;
  1151.     daytim = *sbptr++;
  1152.     martim = *sbptr++;
  1153.     for (i = 0; i < 9; i++)
  1154.         marflg[i] = *sbptr++;
  1155.     oextim = *sbptr++;
  1156.     rdietm = *sbptr++;
  1157.     rvtim = *sbptr++;
  1158.     gvtim = *sbptr++;
  1159.     eattim = *sbptr++;
  1160.     easttm = *sbptr++;
  1161.     filmtm = *sbptr++;
  1162.     screef = *sbptr++;
  1163.     eastsc = *sbptr++;
  1164.     cactsc = *sbptr++;
  1165.     diesc = *sbptr++;
  1166.     filmst = *sbptr++;
  1167.     machst = *sbptr++;
  1168.     dial1 = *sbptr++;
  1169.     dial2 = *sbptr++;
  1170.     dial1x = *sbptr++;
  1171.     dial2x = *sbptr++;
  1172.     bonus = *sbptr++;
  1173.     jackpo = *sbptr++;
  1174.     lpill = *sbptr++;
  1175.     pbstat = *sbptr++;
  1176.     decset = *sbptr++;
  1177.     raset = *sbptr++;
  1178.     dcombi = *sbptr++;
  1179.     chaset = *sbptr++;
  1180.     guardl = *sbptr++;
  1181.         fimage = *sbptr++;
  1182.     iret = read(filedes, sbuffer, 256*sizeof(short));
  1183.     if (iret != 256*sizeof(short))
  1184.         goto lab1;
  1185.     sbptr = sbuffer;
  1186.     iptr = locdat;
  1187.     for (i = 0; i <= LOCNUM; i++)
  1188.         *iptr++ = *sbptr++;
  1189.     iret = read(filedes, sbuffer, 256*sizeof(short));
  1190.     if (iret != 256*sizeof(short))
  1191.         goto lab1;
  1192.     sbptr = sbuffer;
  1193.     iptr = obimpr;
  1194.     for (i = 0; i <= OBJMAX; i++)
  1195.         *iptr++ = *sbptr++;
  1196.     iret = read(filedes, sbuffer, 256*sizeof(short));
  1197.     if (iret != 256*sizeof(short))
  1198.         goto lab1;
  1199.     sbptr = sbuffer;
  1200.     iptr = obloc;
  1201.     for (i = 0; i <= OBJMAX; i++)
  1202.         *iptr++ = *sbptr++;
  1203.         close(filedes);
  1204.     result = 1;
  1205.     chaser = 0;
  1206.     linout(" ", 1);
  1207.     return (result);
  1208.     }
  1209. lab1:
  1210.     linout("Restore failed.", 15);
  1211.     return (result);
  1212. }
  1213. SHAR_EOF
  1214. cat << \SHAR_EOF > verbs1.c
  1215. #include "parame.inc"
  1216. #include "variab.h"
  1217. #include "arrays.h"
  1218.  
  1219. /* World C Version 1.00 copyright 1987 J.D.McDonald 
  1220.    Use as you like for non-commercial purposes, but please
  1221.    leave this note, and document any changes you make as yours */
  1222.  
  1223.  
  1224. vattac()
  1225. {
  1226.     int             i, spk, cplce, n, plce;
  1227.     /*
  1228.      * "attach" or "tie"   not "attack" a mess since it involves the wire  
  1229.      */
  1230.  
  1231.     if (dobjs[0] == CABLE && iobj == ANTENN) {
  1232.     if (loc != 69)
  1233.         spk = 379;
  1234.     else if (obloc[GCABLE] == 2000 + ZANTEN || obloc[DCABLE] == 2000 + ZANTEN)
  1235.         spk = 381;
  1236.     else {
  1237.         n = getobj(dobjs[0], doadjs[0]);
  1238.         if (n <= 0)
  1239.         spk = 70;
  1240.         else {
  1241.         itsher(n, &cplce);
  1242.         if (cplce != 1 && cplce != 3 && cplce != 4)
  1243.             spk = 380;
  1244.         else {
  1245.             obloc[n] = 2000 + ZANTEN;
  1246.             spk = 75;
  1247.         }
  1248.         }
  1249.     }
  1250.     } else if (dobjs[0] != WIRE)
  1251.     spk = 48;
  1252.     else if (iobj == TREE || iobj == LOG || iobj == STOOL)
  1253.     spk = 204;
  1254.     else if (iobj != KNOB && iobj != TOWER)
  1255.     spk = 48;
  1256.     else {
  1257.     itsher(ZWIRE, &plce);
  1258.     if (plce == 0)
  1259.         spk = 213;
  1260.     else if (iobj == TOWER) {
  1261.         if (loc != 48)
  1262.         spk = 205;
  1263.         else {
  1264.         spk = 75;
  1265.         obloc[ZWIRE] = loc;
  1266.         /* -57=177707 octal  */
  1267.  
  1268.         obimpr[ZWIRE] = (obimpr[ZWIRE] & -57) + 24;
  1269.         for (i = 0; i < 6; i++)
  1270.             wirelc[i] = 1000;
  1271.         }
  1272.     } else {
  1273.         if (loc != 42)
  1274.         spk = 206;
  1275.         else if (spcloc == 1) {
  1276.         spk = 75;
  1277.         obloc[ZWIRE] = loc;
  1278.         /* ~56=177707 octal  */
  1279.  
  1280.         obimpr[ZWIRE] = (obimpr[ZWIRE] & ~56) + 32;
  1281.         for (i = 0; i < 6; i++)
  1282.             wirelc[i] = 1000;
  1283.         } else
  1284.         spk = 207;
  1285.     }
  1286.     }
  1287.     speak(spk);
  1288. }
  1289.  
  1290. vattak()
  1291. {
  1292.     int             spk;
  1293.     spk = 286;
  1294.     if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8) {
  1295.     spk = 306;
  1296.     if (pct(33))
  1297.         spk = 302;
  1298.     else if (pct(50))
  1299.         spk = 305;
  1300.     } else if (dobjs[0] == GUARD) {
  1301.     if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9))
  1302.         spk = 562;
  1303.     else
  1304.         spk = 561;
  1305.     } else if (dobjs[0] == MARTIA && loc >= 27 && loc <= 51)
  1306.     spk = 307;
  1307.     else if (dobjs[0] == ROBOT || dobjs[0] == FERRET)
  1308.     spk = 285;
  1309.     speak(spk);
  1310. }
  1311.  
  1312. vbreak()
  1313. {
  1314.     int             j, hplce, xplce;
  1315.     if (iobj != 0 && iobj != HAMMER && iobj != BOULDE) {
  1316.     speak(48);
  1317.     return;
  1318.     }
  1319.     if (iobj == HAMMER) {
  1320.     itsher(ZHAMME, &hplce);
  1321.     if (hplce == 0) {
  1322.         speak(329);
  1323.         return;
  1324.     }
  1325.     }
  1326.     if (iobj == BOULDE) {
  1327.     speak(330);
  1328.     return;
  1329.     }
  1330.     if (dobjs[0] == LOUVER && (loc == 98 || loc == 142)) {
  1331.     speak(282);
  1332.     obimpr[ZLOUVE] = 9;
  1333.     if (iobj == HAMMER)
  1334.         obloc[ZHAMME] = 1000;
  1335.     return;
  1336.     }
  1337.     if (dobjs[0] == FERRET || dobjs[0] == ROBOT || dobjs[0] ==
  1338.     MARTIA || dobjs[0] == CAT || dobjs[0] == FISH) {
  1339.     speak(286);
  1340.     return;
  1341.     }
  1342.     if (dobjs[0] == GUARD) {
  1343.     if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9))
  1344.         speak(562);
  1345.     else
  1346.         speak(561);
  1347.     return;
  1348.     }
  1349.     j = getobj(dobjs[0], doadjs[0]);
  1350.     if (j == -1) {
  1351.     speak(70);
  1352.     return;
  1353.     } else {
  1354.     itsher(j, &xplce);
  1355.     if (xplce == 0)
  1356.         speak(66);
  1357.     else if (j > MOVMAX)
  1358.         speak(332);
  1359.     else if (dobjs[0] == WIRE || dobjs[0] == KNAPSA || dobjs[0] ==
  1360.          SHIRT || dobjs[0] == PANTS || dobjs[0] == BOULDE ||
  1361.          dobjs[0] == PUCK || dobjs[0] == LATEX || dobjs[0] ==
  1362.          NUGGET || dobjs[0] == KNIFE || dobjs[0] == BEAD) {
  1363.         speak(48);
  1364.         return;
  1365.     } else if ((dobjs[0] == KEY || dobjs[0] == SAPPHI || dobjs[0] ==
  1366.             DIAMON || dobjs[0] == SPHERE) && iobj != HAMMER)
  1367.         speak(385);
  1368.     else if (j == ZSEED) {
  1369.         if (loc != 131 && loc != 99 && loc != 100) {
  1370.         speak(337);
  1371.         obimpr[ZSEED] = 0;
  1372.         } else if (loc != 100) {
  1373.         speak(338);
  1374.         obimpr[ZSEED] = 0;
  1375.         } else {
  1376.         speak(340);
  1377.         obimpr[ZSEED] = 3;
  1378.         /* seed function here  */
  1379.  
  1380.         }
  1381.         obloc[ZSEED] = 0;
  1382.     } else if (j == ZSTATU && loc == 99 && obloc[j] == 99)
  1383.         speak(89);
  1384.     else if (j == CEGG) {
  1385.         speak(480);
  1386.         obloc[CEGG] = 0;
  1387.         obloc[SCOIN] = loc;
  1388.     } else {
  1389.         speak(331);
  1390.         if (j == GSPHER) {
  1391.         speak(333);
  1392.         obloc[ZBEAD] = obloc[j];
  1393.         }
  1394.         if (obloc[j] == 2000 + RSLOT)
  1395.         obimpr[RSLOT] = 9;
  1396.         obloc[j] = 0;
  1397.     }
  1398.     }
  1399. }
  1400.  
  1401. vdig()
  1402. {
  1403.     int             splce, pplce;
  1404.     if (dobjs[0] != 0 && dobjs[0] != SHOVEL && dobjs[0] != PITCHF)
  1405.     speak(48);
  1406.     else if (loc != 73)
  1407.     speak(284);
  1408.     else {
  1409.     itsher(ZSHOVE, &splce);
  1410.     itsher(ZPITCH, &pplce);
  1411.     if ((dobjs[0] == SHOVEL && splce != 0) ||
  1412.         (dobjs[0] == PITCHF && pplce != 0) ||
  1413.         (dobjs[0] == 0 && (splce > 0 || pplce > 0))) {
  1414.         if (obimpr[RHOLE] != 17)
  1415.         speak(283);
  1416.         else
  1417.         speak(434);
  1418.         obimpr[RHOLE] = 17;
  1419.     } else if ((dobjs[0] == SHOVEL && splce == 0) || (dobjs[0] ==
  1420.                               PITCHF && pplce == 0))
  1421.         speak(89);
  1422.     else
  1423.         speak(234);
  1424.     }
  1425. }
  1426.  
  1427.  
  1428. vdrink()
  1429. {
  1430.     int             spk;
  1431.     /* pervert!!!!  */
  1432.  
  1433.     if (dobjs[0] == NPISS) {
  1434.     dirty += 1;
  1435.     spk = 183;
  1436.     }
  1437.     /* water is o.k. */
  1438.  
  1439.     else if (dobjs[0] == WATER) {
  1440.     if ((locdat[loc] & 1024) == 1024)
  1441.         spk = 184;
  1442.     else
  1443.         spk = 74;
  1444.     } else
  1445.     spk = 48;
  1446.     speak(spk);
  1447. }
  1448.  
  1449. vdrop()
  1450. {
  1451.     int             d, i, ambig, ddflg, empty, plce, plural, kkwr, kk, spk;
  1452.  
  1453.     /* special code for "drop something into bowl" */
  1454.  
  1455.     if (prepio != 0 && !(prepio == IN && iobj == BOWL)) {
  1456.     speak(28);
  1457.     return;
  1458.     }
  1459.     /* convert dobjs(1) (noun) list into list of objects (pointers) */
  1460.  
  1461.     ambig = !cnvobj();
  1462.     if (allflg)
  1463.     getall();
  1464.     for (i = 0; i < 30; i++) {
  1465.     ddflg = 0;
  1466.     empty = 1;
  1467.     d = dobjs[i];
  1468.     if (d == 0)
  1469.         continue;
  1470.     /* see if it is here */
  1471.  
  1472.     itsher(d, &plce);
  1473.     if (allflg && ((plce != 1 && plce != 2) || d > MOVMAX))
  1474.         continue;
  1475.     if (dobjs[1] != 0 || allflg)
  1476.         speak(odistb[d]);
  1477.     plural = (obpprp[d] & 256) == 256;
  1478.     if (d > MOVMAX)
  1479.         spk = 48;
  1480.     else if (plce == 2) {
  1481.         spk = 88;
  1482.         if (plural)
  1483.         spk = 194;
  1484.     } else if (d == ZWIRE && plce != 1) {
  1485.         for (kkwr = 0; kkwr < 6; kkwr++)
  1486.         if (wirelc[kkwr] == 1000)
  1487.             wirelc[kkwr] = loc;
  1488.         if (obloc[d] == loc && wirelc[5] == loc) {
  1489.         for (kkwr = 0; kkwr < 6; kkwr++)
  1490.             wirelc[kkwr] = 0;
  1491.         }
  1492.         spk = 82;
  1493.     } else if (plce == 0 || plce == 4 || plce == 5) {
  1494.         spk = 89;
  1495.         if (plural)
  1496.         spk = 195;
  1497.     } else if (d == ZSEED && (wrdnum[0] == DROP || wrdnum[0] == THROW)) {
  1498.         if (loc == 100) {
  1499.         spk = 340;
  1500.         obimpr[ZSEED] = 0;
  1501.         } else if (loc == 131 || loc == 99) {
  1502.         spk = 338;
  1503.         obimpr[ZSEED] = 3;
  1504.         } else {
  1505.         obimpr[ZSEED] = 0;
  1506.         spk = 337;
  1507.         }
  1508.         obloc[ZSEED] = 0;
  1509.     } else if (d == CFISH && obloc[d] ==
  1510.            (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5))
  1511.         spk = 76;
  1512.     /*
  1513.      * code for knocking the puck out of the arena loc38 is center of
  1514.      * bowl, 23-37 are the rim  
  1515.          */
  1516.  
  1517.     else if (iobj == BOWL) {
  1518.         if (loc < 32 || loc > 38)
  1519.         spk = 156;
  1520.         else {
  1521.         if (d == RBOULD && loc != 38) {
  1522.             itsher(RBOULD, &plce);
  1523.             /* marflg[1] tells if martians are there */
  1524.  
  1525.             if (marflg[1]) {
  1526.             speak(157);
  1527.             vdead();
  1528.             oldloc = 0;
  1529.             oldlc2 = 0;
  1530.             return;
  1531.             } else {
  1532.             if (obloc[HPUCK] == 38) {
  1533.                 /*
  1534.                  * the next line tells if other rim is low or
  1535.                  * high 
  1536.                              */
  1537.  
  1538.                 if ((loc & 1) == 1) {
  1539.                 /* we shoot the puck out */
  1540.  
  1541.                 spk = 158;
  1542.                 obloc[RBOULD] = 38;
  1543.                 obloc[HPUCK] = loc + 3;
  1544.                 if (obloc[HPUCK] > 37)
  1545.                     obloc[HPUCK] -= 6;
  1546.                 } else {
  1547.                 spk = 159;
  1548.                 obloc[RBOULD] = 38;
  1549.                 }
  1550.             } else {
  1551.                 /* in this  case it settles back in  */
  1552.  
  1553.                 if ((loc & 1) == 1) {
  1554.                 spk = 160;
  1555.                 obloc[RBOULD] = loc + 3;
  1556.                 if (obloc[RBOULD] > 37)
  1557.                     obloc[RBOULD] -= 6;
  1558.                 } else {
  1559.                 spk = 161;
  1560.                 obloc[RBOULD] = 38;
  1561.                 }
  1562.             }
  1563.             /* smash the other items in the bowl  */
  1564.  
  1565.             for (kk = 1; kk <= MOVMAX; kk++) {
  1566.                 if (kk == RBOULD || kk == HPUCK)
  1567.                 continue;
  1568.                 if (obloc[kk] == 38) {
  1569.                 obloc[kk] = 0;
  1570.                 empty = 0;
  1571.                 }
  1572.             }
  1573.             }
  1574.         } else {
  1575.             spk = 75;
  1576.             obloc[d] = 38;
  1577.             ddflg = 1;
  1578.         }
  1579.         }
  1580.     } else {
  1581.         if (d == ZCAT)
  1582.         spk = 334;
  1583.         else if (d == RBOULD)
  1584.         spk = 335;
  1585.         else if (d == ZORCHI && loc == 87)
  1586.         spk = 432;
  1587.         else if (d == ZFLYTR && loc == 87)
  1588.         spk = 433;
  1589.         else
  1590.         spk = 82;
  1591.         obloc[d] = loc;
  1592.         ddflg = 1;
  1593.     }
  1594.     if (d == ZLATEX && ddflg == 1)
  1595.         obimpr[d] = 337;
  1596.     xindnt += 2;
  1597.     speak(spk);
  1598.     xindnt -= 2;
  1599.     if (empty != 1) {
  1600.         xindnt += 4;
  1601.         speak(162);
  1602.         xindnt -= 4;
  1603.     }
  1604.     }
  1605. }
  1606.  
  1607. veat()
  1608. {
  1609.     int             d, l, spk, plce;
  1610.     /* don't eat shit  */
  1611.  
  1612.     if (dobjs[0] == NSHIT) {
  1613.     dirty += 1;
  1614.     spk = 179;
  1615.     }
  1616.     /* id love for you to do it, but please don't make mama mad  */
  1617.  
  1618.     else if (dobjs[0] == ME) {
  1619.     dirty += 1;
  1620.     spk = 183;
  1621.     } else {
  1622.     d = getobj(dobjs[0], doadjs[0]);
  1623.     /* see if its here */
  1624.  
  1625.     if (d <= 0) {
  1626.         speak(48);
  1627.         return;
  1628.     }
  1629.     itsher(d, &plce);
  1630.     if (plce <= 0) {
  1631.         spk = 66;
  1632.         if ((obpprp[d] & 256) == 256)
  1633.         spk = 185;
  1634.     } else {
  1635.         /* poison!   */
  1636.  
  1637.         if ((obpprp[d] & 8) == 8) {
  1638.         if (d == CFISH && obloc[d] ==
  1639.             (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5)) {
  1640.             speak(76);
  1641.             return;
  1642.         }
  1643.         speak(181);
  1644.         oldloc = 0;
  1645.         oldlc2 = 0;
  1646.         if (d <= MOVMAX)
  1647.             obloc[d] = 0;
  1648.         vdead();
  1649.         return;
  1650.         }
  1651.         /* it's edible, and delicious   */
  1652.  
  1653.         else if ((obpprp[d] & 4) == 4) {
  1654.         spk = 180;
  1655.         if (d <= MOVMAX)
  1656.             obloc[d] = 0;
  1657.         if (d != BBALL)
  1658.             eattim = 0;
  1659.         if (d == CEGG) {
  1660.             spk = 478;
  1661.             obloc[SCOIN] = 1000;
  1662.         }
  1663.         if (d == LETTUC)
  1664.             eattim = 150;
  1665.         if (d == BBALL) {
  1666.             lpill = 1;
  1667.             spk = 522;
  1668.             bonus += 5;
  1669.             dcombi = (qrand() % 31);
  1670.             if (dcombi == 0)
  1671.             dcombi = 1;
  1672.             l = (qrand() % 31);
  1673.             if (l == 0)
  1674.             l = 22;
  1675.             dcombi = dcombi * 32 + l;
  1676.             l = (qrand() % 31);
  1677.             if (l == 0)
  1678.             l = 3;
  1679.             dcombi = dcombi * 32 + l;
  1680.                 }
  1681.         /* inedible  */
  1682.  
  1683.         } else
  1684.         spk = 182;
  1685.     }
  1686.     }
  1687.     speak(spk);
  1688. }
  1689.  
  1690.  
  1691.  
  1692. vfill()
  1693. {
  1694.     int             result, z, z2, spk, i, empty, plce;
  1695.     result = 0;
  1696.     z = dobjs[0];
  1697.     spk = 48;
  1698.     if (dobjs[0] == FUNNEL && iobj == WATER) {
  1699.     result = 1;
  1700.     dobjs[0] = WATER;
  1701.     iobj = FUNNEL;
  1702.     ioadj = doadjs[0];
  1703.     doadjs[0] = 0;
  1704.     prepio = IN;
  1705.     return (result);
  1706.     }
  1707.     if (dobjs[0] == TUBE) {
  1708.     speak(494);
  1709.     return (result);
  1710.     }
  1711.     /* fill the bag or bucket with water or latex  */
  1712.  
  1713.     empty = 1;
  1714.     if (z == BUCKET) {
  1715.     for (i = 1; i <= OBJMAX; i++)
  1716.         if (obloc[i] == 2039)
  1717.         empty = 0;
  1718.     }
  1719.     if (z == BUCKET && iobj == LATEX && obloc[ZLATEX] == 66 &&
  1720.     prepio == WITH && loc == 66) {
  1721.     if (obimpr[ZBUCKE] == 1033)
  1722.         spk = 274;
  1723.     else if (empty == 0)
  1724.         spk = 275;
  1725.     else {
  1726.         obloc[ZLATEX] = 2000 + ZBUCKE;
  1727.         obimpr[ZBUCKE] = 1545;
  1728.         obimpr[ZLATEX] = 265;
  1729.         spk = 75;
  1730.     }
  1731.     } else if ((z == BAG && (doadjs[0] == 0 || doadjs[0] == PLASTI)) ||
  1732.            (z == BUCKET && doadjs[0] == 0)) {
  1733.     if ((prepio == WITH && iobj == WATER) ||
  1734.         (((locdat[loc] & 1024) == 1024) && prepio == 0
  1735.          && iobj == 0)) {
  1736.         z2 = ZBUCKE;
  1737.         if (z == BAG)
  1738.         z2 = PLBAG;
  1739.         itsher(z2, &plce);
  1740.         if (plce == 0)
  1741.         spk = 73;
  1742.         else if ((locdat[loc] & 1024) != 1024 && ((obloc[ZBUCKE]
  1743.               != loc && obloc[ZBUCKE] != 1000) || obimpr[ZBUCKE]
  1744.                               != 1033))
  1745.         spk = 74;
  1746.         else if (empty == 1) {
  1747.         if (z2 == PLBAG)
  1748.             obimpr[z2] = 2697;
  1749.         else
  1750.             obimpr[z2] = 1033;
  1751.         spk = 75;
  1752.         obloc[z2] = 1000;
  1753.         } else
  1754.         spk = 275;
  1755.     } else if (iobj == 0)
  1756.         spk = 278;
  1757.     }
  1758.     speak(spk);
  1759.     return (result);
  1760. }
  1761.  
  1762. vfuck()
  1763. {
  1764.     if (dirty < 10)
  1765.     speak(495);
  1766.     else if (dirty > 20)
  1767.     speak(497);
  1768.     else
  1769.     speak(496);
  1770. }
  1771.  
  1772.  
  1773. vget()
  1774. {
  1775.     int             spk, result;
  1776.     result = 0;
  1777.     spk = 0;
  1778.     if (prepdo == IN && dobjs[0] == CHAIR && (loc == 166 ||
  1779.                           loc == 175)) {
  1780.     spcloc = 2;
  1781.     spk = 510;
  1782.     }
  1783.     /* get up is a joke  */
  1784.  
  1785.     else if (prepdo == UP) {
  1786.     if (dobjs[0] == 0 && spcloc == 2) {
  1787.         spk = 511;
  1788.         spcloc = 0;
  1789.     } else
  1790.         spk = 208;
  1791.     }
  1792.     /* get on or off glass plate   */
  1793.  
  1794.     else if (dobjs[0] == GLASS && (doadjs[0]
  1795.                  == 0 || doadjs[0] == GLASS) && dobjs[1] == 0) {
  1796.     if (prepdo == OFF && spcloc == 1) {
  1797.         spcloc = 0;
  1798.         spk = 75;
  1799.     } else if (prepdo == ON && spcloc == 0) {
  1800.         spcloc = 1;
  1801.         spk = 75;
  1802.     }
  1803.     }
  1804.     /* get something  means take it */
  1805.  
  1806.     else if (prepdo == ON || prepdo == OFF)
  1807.     spk = 71;
  1808.     else
  1809.     result = 1;
  1810.     /* this results in calling vtake  */
  1811.  
  1812.     if (spk != 0)
  1813.     speak(spk);
  1814.     return (result);
  1815. }
  1816.  
  1817. vgive()
  1818. {
  1819.     int             spk, ij, iplce, dj, dplce;
  1820.     spk = 0;
  1821.     if (iobj == ME)
  1822.     spk = 445;
  1823.     else if (iobj == GUARD) {
  1824.     if (loc == guardl || loc == 171 || (chaset != 0 &&
  1825.                         chaset <= 9))
  1826.         spk = 562;
  1827.     else
  1828.         spk = 561;
  1829.     } else if (iobj == MARTIA) {
  1830.     if (martim == 7 && loc >= 27 && loc <= 51)
  1831.         spk = 446;
  1832.     else
  1833.         spk = 168;
  1834.     } else if (iobj == FERRET && !(loc == 131 || loc == 99
  1835.                    || loc == 100))
  1836.     spk = 447;
  1837.     else if (iobj != CAT && iobj != BIRD && iobj != BEES &&
  1838.          iobj != FROG && iobj != ROBOT)
  1839.     spk = 448;
  1840.     else {
  1841.     ij = getobj(iobj, ioadj);
  1842.     if (iobj == BIRD && ij < 0)
  1843.         ij = YBIRD;
  1844.     itsher(ij, &iplce);
  1845.     if (iplce == 0) {
  1846.         if (iobj == CAT)
  1847.         spk = 449;
  1848.         else if (iobj == BEES)
  1849.         spk = 450;
  1850.         else if (iobj == FROG)
  1851.         spk = 451;
  1852.         else if (iobj == ROBOT)
  1853.         spk = 452;
  1854.         else if (iobj == BIRD)
  1855.         spk = 453;
  1856.     } else {
  1857.         if (iobj == FROG)
  1858.         spk = 454;
  1859.         else if (iobj == BIRD)
  1860.         spk = 455;
  1861.     }
  1862.     }
  1863.     if (spk != 0) {
  1864.     speak(spk);
  1865.     return;
  1866.     }
  1867.     dj = getobj(dobjs[0], doadjs[0]);
  1868.     if (dj < 0)
  1869.     spk = 70;
  1870.     else if (dj == 0)
  1871.     spk = 28;
  1872.     else {
  1873.     itsher(dj, &dplce);
  1874.     if (dplce == 0) {
  1875.         if ((obimpr[dj] & 256) != 0)
  1876.         spk = 185;
  1877.         else
  1878.         spk = 89;
  1879.     } else if (obloc[dj] == 2000 + ij)
  1880.         spk = 456;
  1881.     else if (dj > MOVMAX)
  1882.         spk = odistb[dj + 1] - 1;
  1883.     else if (dplce > 3)
  1884.         spk = 458;
  1885.     else;
  1886.     }
  1887.     if (spk != 0) {
  1888.     speak(spk);
  1889.     return;
  1890.     }
  1891.     /* at this point you have it, and someone is here to take it. */
  1892.  
  1893.     if (iobj == CAT) {
  1894.     if (dobjs[0] == FISH) {
  1895.         spk = 459;
  1896.         obloc[dj] = 0;
  1897.     } else if ((obpprp[dj] & 12) != 0)
  1898.         spk = 460;
  1899.     else
  1900.         spk = 461;
  1901.     } else if (iobj == FERRET) {
  1902.     if (dobjs[0] == EGG || dobjs[0] == FISH || dobjs[0] == CAT) {
  1903.         spk = 462;
  1904.         obloc[dj] = 0;
  1905.     } else if ((obpprp[dj] & 12) != 0)
  1906.         spk = 464;
  1907.     else {
  1908.         spk = 463;
  1909.         obloc[dj] = 0;
  1910.     }
  1911.     } else if (iobj == BEES) {
  1912.     if (iobj != ORCHID && iobj != FLYTRA)
  1913.         spk = 465;
  1914.     else if (iobj == ORCHID) {
  1915.         spk = 432;
  1916.         obloc[dj] = loc;
  1917.     } else {
  1918.         spk = 433;
  1919.         obloc[dj] = loc;
  1920.     }
  1921.     } else if (iobj == ROBOT) {
  1922.     if (obloc[ZCART] != RSLOT + 2000 && obloc[CCART] != RSLOT + 2000)
  1923.         spk = 466;
  1924.     else if (obw3[dj] / 256 > 1 || (obw3[dj] & 255) > 2)
  1925.         spk = 352;
  1926.     else {
  1927.         spk = 345;
  1928.         obloc[dj] = 2000 + ZROBOT;
  1929.     }
  1930.     }
  1931.     speak(spk);
  1932. }
  1933.  
  1934. vhelp()
  1935. {
  1936.     speak(105);
  1937. }
  1938.  
  1939.  
  1940. vkiss()
  1941. {
  1942.     int             result, spk, cplce;
  1943.     /* if vkiss ends up 1, call vpush */
  1944.  
  1945.     result = 0;
  1946.     if (dobjs[0] == FROG && loc == 67)
  1947.     spk = 468;
  1948.     else if (dobjs[0] == GUARD) {
  1949.     if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9))
  1950.         spk = 562;
  1951.     else
  1952.         spk = 561;
  1953.     } else if (dobjs[0] == FERRET && (loc == 131 || loc == 100 || loc == 99))
  1954.     spk = 469;
  1955.     else if (dobjs[0] == CAT) {
  1956.     itsher(ZCAT, &cplce);
  1957.     if (cplce != 0)
  1958.         spk = 470;
  1959.     else
  1960.         spk = 449;
  1961.     } else if (dobjs[0] == ME)
  1962.     spk = 471;
  1963.     else if (dobjs[0] == BIRD || dobjs[0] == BEES || dobjs[0] == ROBOT)
  1964.     spk = 472;
  1965.     else
  1966.     result = 1;
  1967.     if (result == 0)
  1968.     speak(spk);
  1969.     return (result);
  1970. }
  1971.  
  1972. vlocks()
  1973. {
  1974.     int             n, plce, spk;
  1975.     n = getobj(dobjs[0], doadjs[0]);
  1976.     if (n < 0)
  1977.     spk = 70;
  1978.     else if (n == 0)
  1979.     spk = 28;
  1980.     else if ((obpprp[n] & 512) != 512 && n != ZBOX)
  1981.     spk = 233;
  1982.     else {
  1983.     itsher(n, &plce);
  1984.     if (plce <= 0) {
  1985.         if (dobjs[0] == DOOR)
  1986.         spk = 225;
  1987.         else
  1988.         spk = 66;
  1989.     } else if (n == ZBOX)
  1990.         spk = 389;
  1991.     else if (n == ODOOR || n == PDOOR)
  1992.         spk = 524;
  1993.     else if (prepio == WITH && iobj == KEY) {
  1994.         if (n == RDOOR || (n == MDOOR && loc == 41))
  1995.         spk = 235;
  1996.         else if (n == MDOOR || n == GDOOR) {
  1997.         if (wrdnum[0] == LOCK)
  1998.             obimpr[n] |= 4;
  1999.         else
  2000.             obimpr[n] = (obimpr[n] & ~4);
  2001.         /* ~4=177773 octal */
  2002.  
  2003.         spk = 75;
  2004.         } else
  2005.         spk = 48;
  2006.     } else
  2007.         spk = 234;
  2008.     }
  2009.     speak(spk);
  2010. }
  2011.  
  2012.     static   char   strng3[] = "The left dial is set to     and the right to    .";
  2013.     static   char   strng4[] = "are     for the left and     for the right.";
  2014. vlooks()
  2015. /*
  2016.  * look or examine 
  2017.  */
  2018.  
  2019. {
  2020.     char            cnum[4];
  2021.  
  2022.     int             kk, zplce, spk, kkwr, lwire, n, plce, u, empty;
  2023.  
  2024.     if ((prepdo == THROUG && dobjs[0] == TELESC && wrdnum[0] ==
  2025.      LOOK) || (wrdnum[0] == EXAMIN && dobjs[0] == PLANET &&
  2026.            prepio == WITH && iobj == TELESC)) {
  2027.     if (loc >= 175 && loc <= 181)
  2028.         spk = loc + 326;
  2029.     else if (loc == 184 || loc == 187)
  2030.         spk = 507;
  2031.     else
  2032.         spk = 48;
  2033.     speak(spk);
  2034.     return;
  2035.     }
  2036.     if ((loc >= 43 && loc <= 45) && (dobjs[0] == HOLE || dobjs[0]
  2037.                      == DOOR)) {
  2038.     if (daytim == 1)
  2039.         speak(173);
  2040.     else
  2041.         speak(174);
  2042.     return;
  2043.     }
  2044.     if (dobjs[0] == HOUSE && (doadjs[0] == 0 || doadjs[0] == DOLL)
  2045.     && prepdo == IN) {
  2046.     if (loc != 132)
  2047.         speak(481);
  2048.     else if (obimpr[CEGG] > 4096) {
  2049.         speak(479);
  2050.         obloc[CEGG] = 132;
  2051.     } else
  2052.         speak(480);
  2053.     return;
  2054.     }
  2055.     /* you can't examine things at night unless they glow  */
  2056.  
  2057.     if (daytim == 0 && dobjs[0] != SPHERE) {
  2058.     speak(120);
  2059.     return;
  2060.     }
  2061.     if (wrdnum[0] == EXAMIN)
  2062.     prepdo = AT;
  2063.     if (dobjs[0] == TELESC) {
  2064.     if ((loc >= 175 && loc <= 181) || loc == 184 || loc == 187)
  2065.         speak(534);
  2066.     else
  2067.         speak(535);
  2068.     return;
  2069.     }
  2070.     /* if you look behind horsetails, there is a cave  */
  2071.  
  2072.     if (prepio == 0 && prepdo == BEHIND && loc == 169 &&
  2073.     dobjs[0] == CABINE) {
  2074.     speak(523);
  2075.     return;
  2076.     }
  2077.     if (prepio == 0 && prepdo == BEHIND && loc == 24) {
  2078.     if (dobjs[0] == HORSET) {
  2079.         speak(119);
  2080.         horflg = 1;
  2081.         return;
  2082.     } else if (dobjs[0] == WATERF) {
  2083.         speak(493);
  2084.         horflg = 1;
  2085.         return;
  2086.     }
  2087.     }
  2088.     /*
  2089.      * in the (hockey) bowl you can only see if something is there, not what
  2090.      * it is  
  2091.      */
  2092.  
  2093.     if (prepdo == IN && dobjs[0] == BOWL && (loc >= 32 && loc <= 37)) {
  2094.     empty = 1;
  2095.     for (kk = 1; kk <= MOVMAX; kk++)
  2096.         if (obloc[kk] == 38)
  2097.         empty = 0;
  2098.     if (empty == 1)
  2099.         speak(7);
  2100.     else
  2101.         speak(163);
  2102.     return;
  2103.     }
  2104.     if ((loc == 28) && (dobjs[0] == STOOLS || dobjs[0] == STOOL ||
  2105.          dobjs[0] == BOWL) && (doadjs[0] == 0 || doadjs[0] == CERAMI)) {
  2106.     speak(176);
  2107.     return;
  2108.     }
  2109.     /* various martian things  */
  2110.  
  2111.     if (loc == 42 && (dobjs[0] == STOOLS || dobjs[0] == BOWL)) {
  2112.     speak(177);
  2113.     spcloc = 0;
  2114.     return;
  2115.     }
  2116.     if (loc == 30 && (dobjs[0] == BUILDI || dobjs[0] == WINDOW)
  2117.     && prepdo == IN) {
  2118.     speak(174);
  2119.     return;
  2120.     }
  2121.     if (dobjs[0] == CACTUS && loc == 82 && wrdnum[0] == EXAMIN) {
  2122.     if (pct(25) && (cactsc & 2) == 0) {
  2123.         speak(371);
  2124.         cactsc += 2;
  2125.         if (cactsc == 3)
  2126.         speak(439);
  2127.     } else if ((cactsc & 1) == 0) {
  2128.         speak(370);
  2129.         cactsc += 1;
  2130.         if (cactsc == 3)
  2131.         speak(439);
  2132.     } else
  2133.         speak(237);
  2134.     return;
  2135.     }
  2136.     if (dobjs[0] == DIAL) {
  2137.     itsher(ZBOX, &zplce);
  2138.     if (zplce == 0)
  2139.         speak(388);
  2140.     else {
  2141.         numcvt(dial1, cnum);
  2142.         strng3[24] = cnum[1];
  2143.         strng3[25] = cnum[2];
  2144.         strng3[26] = cnum[3];
  2145.         numcvt(dial2, cnum);
  2146.         strng3[45] = cnum[1];
  2147.         strng3[46] = cnum[2];
  2148.         strng3[47] = cnum[3];
  2149.         linout(strng3, 49);
  2150.     }
  2151.     return;
  2152.     }
  2153.     /*
  2154.      * special code for anything other than "look at object" or "look in
  2155.      * container" gotes above here 
  2156.      */
  2157.  
  2158.     n = getobj(dobjs[0], doadjs[0]);
  2159.     if (prepio != 0 || (prepdo != AT && prepdo != IN)) {
  2160.     speak(94);
  2161.     return;
  2162.     }
  2163.     if (n == 0) {
  2164.     speak(95);
  2165.     return;
  2166.     } else if (n < 0) {
  2167.     speak(70);
  2168.     return;
  2169.     }
  2170.     itsher(n, &plce);
  2171.     lwire = 0;
  2172.     /* special code for wire in several places at once  */
  2173.  
  2174.     if (n == ZWIRE) {
  2175.     for (kkwr = 0; kkwr < 6; kkwr++)
  2176.         if (wirelc[kkwr] == loc)
  2177.         lwire = 1;
  2178.     }
  2179.     if (plce < 1 && !lwire) {
  2180.     if ((obpprp[n] & 256) == 256)
  2181.         speak(185);
  2182.     else
  2183.         speak(66);
  2184.     return;
  2185.     }
  2186.     if (plce < 1 && n == ZWIRE && lwire) {
  2187.     speak(215);
  2188.     return;
  2189.     }
  2190.     /* the generic "look at" processor  */
  2191.  
  2192.     if (prepdo == AT) {
  2193.     u = (obimpr[n] / 64 % 8);
  2194.     if (u == 0) {
  2195.         if ((obpprp[n] & 256) == 256)
  2196.         speak(193);
  2197.         else
  2198.         speak(96);
  2199.     }
  2200.     /* zzzzzzap if not standing on glass while looking at knob  */
  2201.  
  2202.     else if ((n == ZSTOOL || n == ZKNOB) && spcloc == 1)
  2203.         speak(237);
  2204.     else if (n == ZANTEN) {
  2205.         if (obloc[DCABLE] == 2000 + ZANTEN) {
  2206.         speak(odistb[n] + 1);
  2207.         obimpr[DCABLE] = 137;
  2208.         } else if (obloc[GCABLE] == 2000 + ZANTEN)
  2209.         speak(odistb[n] + 2);
  2210.         else
  2211.         speak(odistb[n] + 3);
  2212.     } else {
  2213.         if ((n == MMAP || n == NNEWS || n == TMACH || n == NNOTE
  2214.          ) && loc >= 153 && lpill == 1)
  2215.         u += 1;
  2216.         speak(odistb[n] + u);
  2217.         if (n == NNOTE && lpill == 1)
  2218.         nreadx();
  2219.         if (n == ZSCREE && obimpr[n] == 145 && loc == 146)
  2220.         robdsc();
  2221.         if (dobjs[0] == BOX) {
  2222.         numcvt(dial1, cnum);
  2223.         strng3[24] = cnum[1];
  2224.         strng3[25] = cnum[2];
  2225.         strng3[26] = cnum[3];
  2226.         numcvt(dial2, cnum);
  2227.         strng3[45] = cnum[1];
  2228.         strng3[46] = cnum[2];
  2229.         strng3[47] = cnum[3];
  2230.         linout(strng3, 49);
  2231.         }
  2232.         if (dobjs[0] == FILM && obimpr[ZFILM] == 201) {
  2233.         wwflag = 1;
  2234.         speak(odistb[fimage]);
  2235.         wwflag = 0;
  2236.         outst2[0] |= 32;
  2237.                 outst2[kmax] = '.';
  2238.                 outst2[kmax+1] = '\0';
  2239.         linout(outst2, kmax+1);
  2240.         if (fimage == ZBOX) {
  2241.             speak(404);
  2242.             numcvt(dial1x, cnum);
  2243.             strng4[4] = cnum[1];
  2244.             strng4[5] = cnum[2];
  2245.             strng4[6] = cnum[3];
  2246.             numcvt(dial2x, cnum);
  2247.             strng4[25] = cnum[1];
  2248.             strng4[26] = cnum[2];
  2249.             strng4[27] = cnum[3];
  2250.             linout(strng4, 49);
  2251.         }
  2252.         }
  2253.         /*
  2254.          * special code for flags set by looking at or in object goes
  2255.          * below here  
  2256.              */
  2257.  
  2258.         if (n == PPHOTO)
  2259.         horflg = 1;
  2260.     }
  2261.     }
  2262.     if (obpprp[n] / 2048 != 0)
  2263.     xcontn(n);
  2264.     else if (prepdo == IN)
  2265.     speak(97);
  2266.     return;
  2267. }
  2268.  
  2269. vopen()
  2270. {
  2271.     int             spk, n, plce;
  2272.     if (prepdo != 0 && prepio != 0)
  2273.     spk = 21;
  2274.     /* there is no door on the bar to open or close  */
  2275.  
  2276.     else if ((loc == 30 || loc == 42) && dobjs[0] == DOOR)
  2277.     spk = 224;
  2278.     /* open doors or containers  */
  2279.  
  2280.     else {
  2281.     n = getobj(dobjs[0], doadjs[0]);
  2282.     if (dobjs[0] == DOOR && (loc == 184 || loc == 187 ||
  2283.                  (loc >= 176 && loc <= 181)))
  2284.         n = BDOOR;
  2285.     if (n < 0)
  2286.         spk = 70;
  2287.     else if (n == 0)
  2288.         spk = 66;
  2289.     /* if they can be opened */
  2290.  
  2291.     else if ((obpprp[n] % 2) != 1) {
  2292.         if (obpprp[n] / 2048 != 0)
  2293.         spk = 254;
  2294.         else
  2295.         spk = 230;
  2296.     } else {
  2297.         itsher(n, &plce);
  2298.         if (dobjs[0] == DOOR && (loc == 184 || loc == 187 ||
  2299.                      (loc >= 176 && loc <= 181)))
  2300.         plce = 5;
  2301.         if (plce <= 0) {
  2302.         if (dobjs[0] == DOOR)
  2303.             spk = 225;
  2304.         else
  2305.             spk = 66;
  2306.         }
  2307.         /* and aren't locked ,but are closed  */
  2308.  
  2309.         else if ((obimpr[n] & 4) == 4) {
  2310.         if (n == ZBOX)
  2311.             spk = 389;
  2312.         else
  2313.             spk = 228;
  2314.         } else if ((obimpr[n] & 2) == 0)
  2315.         spk = 226;
  2316.         else if (dobjs[0] == DOOR && (loc <= 180 && loc >= 176))
  2317.         spk = 546;
  2318.         else if (dobjs[0] == CABINE && adverb != CAREFU && adverb !=
  2319.              QUIETL)
  2320.         spk = 553;
  2321.         else {
  2322.         spk = 231;
  2323.         obimpr[n] = (obimpr[n] & ~2);
  2324.         /* ~2=177775 octal */
  2325.  
  2326.         if (n == RDOOR || n == MDOOR || n == GDOOR || n ==
  2327.             ODOOR || n == BDOOR)
  2328.             obimpr[n] += 8;
  2329.         if (n == ZDESK && dial1x == -1) {
  2330.             /*
  2331.              * establish the proper setting of the dials when the box
  2332.              * is first seen 
  2333.                      */
  2334.  
  2335.             dial1x = (qrand() % 999) + 1;
  2336.             dial2x = (qrand() % 999) + 1;
  2337.         }
  2338.         }
  2339.     }
  2340.     }
  2341.     speak(spk);
  2342.     if (spk == 553)
  2343.     vdead();
  2344. }
  2345.  
  2346.  
  2347. vpick()
  2348. {
  2349.     int             result;
  2350.     result = 0;
  2351.     /* pick up means take  */
  2352.  
  2353.     if (prepdo == UP) {
  2354.     prepdo = 0;
  2355.     result = 1;
  2356.     }
  2357.     /* this results in calling take  */
  2358.  
  2359.     else if (dobjs[0] == NLOCK && loc == 47)
  2360.     speak(235);
  2361.     else
  2362.     speak(95);
  2363.     return(result);
  2364. }
  2365.  
  2366.  
  2367. vpiss()
  2368. {
  2369.     dirty += 1;
  2370.     {
  2371.     if (loc == 74 && (obimpr[ZVINE] & 56) == 8 && (dobjs[0]
  2372.                     == 0 || dobjs[0] == VINE)) {
  2373.         speak(301);
  2374.         obimpr[ZVINE] += 8;
  2375.     } else if (dirty >= 5 && dirty < 10)
  2376.         speak(40);
  2377.     else if (dirty >= 10) {
  2378.         if (obloc[LPANT] == 3000 || obloc[RPANT] == 3000)
  2379.         speak(41);
  2380.         else
  2381.         speak(42);
  2382.     }
  2383.     }
  2384. }
  2385.  
  2386.  
  2387. vpour()
  2388. {
  2389.     int             result, bplce, pplce, n, plce;
  2390.     result = 0;
  2391.     /* if result set = 1, then call vput  */
  2392.  
  2393.  
  2394.     if (wrdnum[0] == QWATER) {
  2395.     prepio = ON;
  2396.     iobj = dobjs[0];
  2397.     ioadj = doadjs[0];
  2398.     dobjs[0] = WATER;
  2399.     doadjs[0] = 0;
  2400.     }
  2401.     if (dobjs[0] == DEET && prepio == ON && (iobj == ME
  2402.                       || (iobj == VINE && loc == 74))) {
  2403.     itsher(ZDEET, &plce);
  2404.     if (plce == 0)
  2405.         speak(66);
  2406.     else {
  2407.         speak(75);
  2408.         obimpr[ZDEET] = 28762;
  2409.         obloc[ZDEET] = 0;
  2410.     }
  2411.     return (result);
  2412.     }
  2413.     if ((dobjs[0] == DEET || dobjs[0] == METOL || dobjs[0] == HYPO)
  2414.     && iobj == FUNNEL) {
  2415.     wrdnum[0] = PUT;
  2416.     prepio = IN;
  2417.     result = 1;
  2418.     return (result);
  2419.     }
  2420.     if (iobj != 0 && iobj != POLE) {
  2421.     n = getobj(iobj, ioadj);
  2422.     if (n >= 0) {
  2423.         itsher(n, &plce);
  2424.     }
  2425.     if (iobj == FUNNEL && n < 0) {
  2426.         speak(70);
  2427.         return (result);
  2428.     }
  2429.     if (n <= 0 || plce == 0) {
  2430.         speak(48);
  2431.         return (result);
  2432.     }
  2433.     }
  2434.     itsher(ZBUCKE, &bplce);
  2435.     itsher(PLBAG, &pplce);
  2436.     if (dobjs[0] == WATER) {
  2437.     if (bplce != 0 && obimpr[ZBUCKE] == 1033) {
  2438.         if (iobj == FUNNEL) {
  2439.         if (n == LFUNNE || n == RFUNNE) {
  2440.             speak(402);
  2441.             if (obimpr[RLIGHT] != 73) {
  2442.             speak(400);
  2443.             obimpr[RLIGHT] = 73;
  2444.             obimpr[GLIGHT] = 73;
  2445.             }
  2446.             machst |= machst;
  2447.             return(result);
  2448.         } else {
  2449.             if ((machst & 2) == 0)
  2450.             speak(397);
  2451.             machst |= 2;
  2452.             obimpr[ZINDIC] = 145;
  2453.             if ((machst & 16) != 0 && (machst & 1) == 0 &&
  2454.                                        obimpr[RLIGHT] == 73) {
  2455.             speak(399);
  2456.             obimpr[RLIGHT] = 145;
  2457.             obimpr[GLIGHT] = 145;
  2458.             }
  2459.         }
  2460.         } else if (loc != 74 || (obimpr[ZVINE] & 56) != 8)
  2461.         speak(247);
  2462.         else {
  2463.         speak(301);
  2464.         obimpr[ZVINE] = obimpr[ZVINE] + 8;
  2465.         }
  2466.         obimpr[ZBUCKE] = 1545;
  2467.     } else if (pplce != 0 && obimpr[PLBAG] == 2697)
  2468.         speak(248);
  2469.     else
  2470.         speak(48);
  2471.     } else if (dobjs[0] == LATEX && obloc[ZLATEX] == 2000 + ZBUCKE
  2472.            && bplce != 0 && (obimpr[ZLATEX] & 56) == 8) {
  2473.     if (loc != 76 || iobj != POLE) {
  2474.         speak(279);
  2475.         obimpr[ZLATEX] = obimpr[ZLATEX] + 72;
  2476.     } else {
  2477.         speak(75);
  2478.         obimpr[ZLATEX] = obimpr[ZLATEX] + 80;
  2479.     }
  2480.     obloc[ZLATEX] = loc;
  2481.     } else
  2482.     speak(48);
  2483.     return (result);
  2484. }
  2485.  
  2486.  
  2487. vpush()
  2488. {
  2489.     int             result, numbr, ndo, nio, spk, xfilm;
  2490.     result = 0;
  2491.     /* push is also touch   */
  2492.  
  2493.     if ((loc == 165 || loc == 173) && dobjs[0] > 9999) {
  2494.     numbr = dobjs[0] - 10000;
  2495.     if ((loc == 165 && numbr > 30) || (loc == 173 && numbr > 99))
  2496.         speak(532);
  2497.     else if (loc == 165) {
  2498.         pbstat = (pbstat & 1023) * 32 + numbr;
  2499.         if (pbstat == dcombi) {
  2500.         speak(530);
  2501.         /* ~4=177773 octal */
  2502.  
  2503.         obimpr[ODOOR] = (obimpr[ODOOR] & ~4);
  2504.         } else
  2505.         speak(238);
  2506.     } else
  2507.         speak(238);
  2508.     return (result);
  2509.     }
  2510.     if (dobjs[0] == CACTUS && loc == 82) {
  2511.     if (pct(25) && (cactsc & 2) == 0) {
  2512.         speak(371);
  2513.         cactsc = cactsc + 2;
  2514.         if (cactsc == 3)
  2515.         speak(439);
  2516.     } else if ((cactsc & 1) == 0) {
  2517.         speak(370);
  2518.         cactsc = cactsc + 1;
  2519.         if (cactsc == 3)
  2520.         speak(439);
  2521.     } else
  2522.         speak(237);
  2523.     return (result);
  2524.     }
  2525.     if (dobjs[0] == GUARD) {
  2526.     if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9))
  2527.         speak(562);
  2528.     else
  2529.         speak(561);
  2530.     return (result);
  2531.     }
  2532.     ndo = 0;
  2533.     nio = 0;
  2534.     if (dobjs[0] != 0)
  2535.     ndo = getobj(dobjs[0], doadjs[0]);
  2536.     if (iobj != 0)
  2537.     nio = getobj(iobj, ioadj);
  2538.     /*
  2539.      * unlocking the door to warehouse by touching wire to it if wire is
  2540.      * connected to knob in bar 
  2541.      */
  2542.  
  2543.     if ((ndo == MDIMPL && nio == ZWIRE && prepio == WITH) ||
  2544.     (ndo == ZWIRE && nio == MDIMPL && prepio == TO) &&
  2545.     loc == 47) {
  2546.     if (obloc[ZWIRE] != loc && wirelc[0] != loc && wirelc[1] !=
  2547.         loc && wirelc[2] != loc && wirelc[3] != loc &&
  2548.         wirelc[4] != loc && wirelc[5] != 1000 && obloc[ZWIRE]
  2549.         != 1000)
  2550.         spk = 213;
  2551.     /* first test is for connection to knob */
  2552.  
  2553.     else if (((obimpr[ZWIRE] / 8) % 8) == 4 && (wirelc[5] == 1000
  2554.                             || wirelc[5] == loc)) {
  2555.         spk = 238;
  2556.         /* ~4=177773 octal */
  2557.  
  2558.         obimpr[RDOOR] = (obimpr[RDOOR] & ~4);
  2559.     } else
  2560.         spk = 237;
  2561.     } else if ((ndo == ZKNOB || nio == ZKNOB) && loc == 42 && spcloc != 1)
  2562.     spk = 207;
  2563.     else if (ndo == ZLOUVE && (loc == 98 || loc == 142) &&
  2564.          obimpr[ZLOUVE] == 1) {
  2565.     spk = 282;
  2566.     obimpr[ZLOUVE] = 9;
  2567.     } else if (dobjs[0] == BUTTON) {
  2568.     if (ndo == -1)
  2569.         spk = 70;
  2570.     else if (ndo == SBUTTO && loc == 146) {
  2571.         locdat[144] |= 16;
  2572.         locdat[145] |= 16;
  2573.         locdat[147] |= 16;
  2574.         locdat[148] |= 16;
  2575.         locdat[150] |= 16;
  2576.         spk = 238;
  2577.     } else if (ndo == RBUTTO && loc == 146) {
  2578.         speak(383);
  2579.         result = 1;
  2580.         return(result);
  2581.     } else if (ndo == HBUTTO && loc == 146) {
  2582.         if (easttm == 0)
  2583.         easttm = 1;
  2584.         spk = 238;
  2585.     } else if (ndo == TBUTTO && loc == 146) {
  2586.         if (easttm == 51)
  2587.         easttm = 52;
  2588.         spk = 238;
  2589.     } else if (ndo == GBUTTO && loc == 169) {
  2590.         if (adverb == TWICE) {
  2591.         spk = 525;
  2592.         obimpr[HMURAL] = 209;
  2593.         bonus = bonus + 5;
  2594.         chaset = 1;
  2595.         oldlc2 = 0;
  2596.         oldloc = 0;
  2597.         } else
  2598.         spk = 238;
  2599.     } else if (ndo == RDBUTT && loc == 143) {
  2600.         if ((machst & 51) != 18)
  2601.         spk = 237;
  2602.         else {
  2603.         speak(398);
  2604.         xfilm = (filmtm % 1000);
  2605.         if (xfilm >= 3 && xfilm <= 6 && filmtm < 2000 && machst == 30) {
  2606.             if (filmst == 0)
  2607.             obimpr[ZFILM] = obimpr[ZFILM] + 64;
  2608.             else
  2609.             obimpr[ZFILM] = obimpr[ZFILM] + 128;
  2610.         } else if ((machst & 12) != 12)
  2611.             obimpr[ZFILM] = obimpr[ZFILM] + 192;
  2612.         else;
  2613.         obloc[ZFILM] = 2000 + ZHOPPE;
  2614.         machst = 33;
  2615.         return (result);
  2616.         }
  2617.     } else if (loc == 134 && (ndo == VBUTTO || ndo == OBUTTO ||
  2618.                   ndo == WBUTTO || ndo == BBUTTO)) {
  2619.         if (obloc[GDISC] == 2000 + ZRECES && rvtim != 2)
  2620.         spk = 411;
  2621.         else if (obloc[GDISC] == 2000 + ZRECES && rvtim == 2 &&
  2622.              obloc[GCABLE] != 2000 + ZANTEN)
  2623.         spk = 421;
  2624.         else if (obloc[GDISC] == 2000 + ZRECES && rvtim == 2) {
  2625.         if (ndo == VBUTTO) {
  2626.             spk = 415;
  2627.             result = 2;
  2628.         } else if (ndo == OBUTTO) {
  2629.             spk = 416;
  2630.             result = 3;
  2631.         } else if (ndo == BBUTTO) {
  2632.             spk = 417;
  2633.             result = 4;
  2634.         } else {
  2635.             spk = 418;
  2636.             result = 5;
  2637.         }
  2638.         } else
  2639.         spk = 238;
  2640.     } else
  2641.         spk = 419;
  2642.     } else
  2643.     spk = 236;
  2644.     speak(spk);
  2645.     return (result);
  2646. }
  2647. SHAR_EOF
  2648. #    End of shell archive
  2649. exit 0
  2650. -- 
  2651. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  2652. Have five nice days.
  2653.